/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._134_;


import cz.pecinovsky.english.lootp._000_.Run;

import cz.pecinovsky.english.lootp.manager.Mover;


import cz.pecinovsky.english.lootp.manager.CanvasManager_Envelope.               CanvasManager;
import cz.pecinovsky.english.lootp._134_.IModular_134_.                          IModular;
import cz.pecinovsky.english.lootp._134_.TrafficLight_134_.                      TrafficLight;
import cz.pecinovsky.english.lootp._134_.TestUtility_134_.                       TestUtility;


//import cz.pecinovsky.english.lootp._134_.TrafficLightTest_134_.TrafficLightTest;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++
//%I+ >=132z
//
//import cz.pecinovsky.english.lootp.canvasmanager.Mover;
//import cz.pecinovsky.english.lootp.canvasmanager.CanvasManager;
//%I-

import cz.pecinovsky.english.lootp.utility.NamedColor;
import cz.pecinovsky.english.lootp.utility.IO;
import cz.pecinovsky.english.lootp.utility.Position;

import java.util.ArrayList;
import java.util.List;

//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class TrafficLightTest_134_
{    private TrafficLightTest_134_() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Testovací třída {@code TrafficLightTest}  slouží ke komplexnímu otestování
 * třídy {@link TrafficLightTest}.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class TrafficLightTest extends junit.framework.TestCase
{
    private CanvasManager CM;
    private TrafficLight trafficLight0;
    private TrafficLight trafficLightXY;
    private TrafficLight trafficLightXYB;
    private TrafficLight trafficLightXYM;
    private TrafficLight trafficLightXYMB;



//== CONSTANT CLASS ATTRIBUTES =================================================
//== VARIABLE CLASS ATTRIBUTES =================================================
//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ========
//== CONSTANT INSTANCE ATTRIBUTES ==============================================
//== VARIABLE INSTANCE ATTRIBUTES ==============================================
//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param name  Název konstruovaného testu
     */
    public TrafficLightTest(String name)
    {
        super(name);
    }



//== PREPARATION AND CLEANING THE FIXTURE ======================================

    /***************************************************************************
     * Inicializace předcházející spuštění každého testu a připravující tzv.
     * přípravek (fixture), což je sada objektů, s nimiž budou testy pracovat.
     */
    @Override
    protected void setUp()
    {
        trafficLight0   = new TrafficLight();
        trafficLightXY  = new TrafficLight(100,  50);
        trafficLightXYB = new TrafficLight(150, 100, NamedColor.BROWN);
        trafficLightXYM = new TrafficLight (75,  25, 25);
        trafficLightXYMB= new TrafficLight(200,   0, 100, NamedColor.BLUE);

        CM = CanvasManager.getInstance();
        CM.add(trafficLight0);
        CM.add(trafficLightXY);
        CM.add(trafficLightXYB);
        CM.add(trafficLightXYM);
        CM.add(trafficLightXYMB);

        System.out.println("\n====== Instance v přípravku pro " + this +
                           "\n| CM:               " + CM +
                           "\n| trafficLight0:    " + trafficLight0 +
                           "\n| trafficLightXY:   " + trafficLightXY +
                           "\n| trafficLightXYB:  " + trafficLightXYB +
                           "\n| trafficLightXYM : " + trafficLightXYM +
                           "\n| trafficLightXYMB: " + trafficLightXYMB +
                           "\n======");
        IO.inform("Traffic lights prepared");
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    @Override
    protected void tearDown()
    {
    }


//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== THE TESTS =================================================================
//
//     /***************************************************************************
//      *
//      */
//     public void testXXX()
//     {
//     }


    public void testCycle()
    {
        trafficLight0   .cycle();
        trafficLightXY  .cycle();
        trafficLightXYB .cycle();
        trafficLightXYM .cycle();
        trafficLightXYMB.cycle();
    }


    public void testSmoothMovement()
    {
        Mover p = new Mover(10);
        p.moveTo(100, 150, trafficLight0);
        p.moveTo(150,   0, trafficLightXY);
        p.moveTo(100,   0, trafficLightXYB);
        p.moveTo(150, 150, trafficLightXYM);
        p.moveTo(  0,   0, trafficLightXYMB);
    }


    public void testPositionSize()
    {
        TestUtility.setPositionModules(new Position(50, 0), 25, 100);
        TestUtility.positionSize(trafficLight0);
        TestUtility.positionSize(trafficLightXY);
        TestUtility.positionSize(trafficLightXYB);
        TestUtility.positionSize(trafficLightXYM);
        TestUtility.positionSize(trafficLightXYMB);
    }


    public void testSwapPositionsWithCheck()
    {
        TestUtility.swapPositionsWithCheck(trafficLight0,   trafficLightXYMB);
        TestUtility.swapPositionsWithCheck(trafficLightXYB, trafficLightXYM);
        TestUtility.swapPositionsWithCheck(trafficLightXYM, trafficLight0);
    }

//%A+ >136

    /***************************************************************************
     * Vyzkouší schopnosti otočné šipky při objíždění okruhů.
     */
    public void testMobility()
    {
        TestUtility.runRing(new TrafficLight());
    }

//%A-
//%A+ >142

    /***************************************************************************
     * Vyzkouší schopnosti komparátoru ve třídě {@link TestUtility}
     * při řazení trafficLightů.
     */
    public void testSortList()
    {
        List<IModular> seznam = new ArrayList<IModular>();
        seznam.add(trafficLight0);
        seznam.add(trafficLightXY);
        seznam.add(trafficLightXYB);
        seznam.add(trafficLightXYM);
        seznam.add(trafficLightXYMB);
        seznam.add(trafficLight0);
        TestUtility.seřaďSeznam(seznam);
    }

//%A-
//%X+
     /** */
     public void testFixture() {}
//%X-
}

//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================
//Není-li třída testovací, následující dvě metody se smažou


    /***************************************************************************
     * Třída, jejíž instance má na starosti úklid mezi jednotlivými testy,
     * který není možno zakomponovat do metody {@code tearDown()},
     * dokud nebudou studenti umět programovat.
     */
    private static class TearDown implements Run.ITD
    {
        /** {@inheritDoc} */
        @Override
        public void cleanUp()
        {
//            Canvas.clearCanvas();
//            CanvasManager.getInstance().removeAll();
        }
    }


    /***************************************************************************
     * Test method.
     */
    public static void test()
    {
        Run.tests(TrafficLightTest.class,
                new TearDown(),
//                "testFixture",
//                "testCycle",
//                "testPositionSize",
//                "testSmoothMovement",
//                "testSmoothlySwapPositions",
//                "testSwapPositionsWithCheck",
//                "testMobility",
                "testSortList",
                "");
        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main(String[] args)  {  test();  }
}
